//
//  main.m
//  KVO
//
//  Created by apple on 15/9/3.
//  Copyright (c) 2015年 戴维营. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Tiger.h"
#import "Ball.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
//     KVC (Key-Value Coding)，通过字符串（名称）访问对象的属性（成员变量）的方式；
        
//        Tiger *tiger = [Tiger new];
        
//        tiger.age   －－》取不到(getter方法)

//        tiger->_age = 23;也取不到，age是保护的，
        
//      [tiger setValue:@(23) forKey:@"age"];  1⃣️
   
#if 0
        [tiger setValue:@23 forKey:@"age"];   //2⃣️
        
        NSLog(@"age:%@",[tiger valueForKey:@"age"]);
        
        tiger.name = @"小咪";
        NSLog(@"1--->%@",tiger.name);
        
        tiger.name = @"xiaoxiao";
        NSLog(@"3--->%@",tiger.name);
        
        [tiger setValue:@"小明" forKey:@"name"];
        NSLog(@"2-->%@",[tiger valueForKey:@"name"]);
        
//        kvc按一定的顺序查找对象中的变量并进行设置；（方法－－－》实例变量）；
     
        
#endif
        
#if 0
//      KVC和点标记可以形成keypath，用于访问数据；
        
        [tiger setValue:[Ball new] forKey:@"ball"];//tiger里面的指针与指向Ball的指针相等，将tiger与ball建立联系；
        
        [tiger setValue:@"Black" forKeyPath:@"ball.color"];
        
        NSLog(@"%@",[tiger valueForKeyPath:@"ball.color"]);
#endif
        
        
#if 1
//        获取集合中所有对象的某个属性，结果为集合（数组）；
        
        Tiger *t0 = [Tiger tigerWithName:@"张三" weight:120];
        
        Tiger *t1 = [Tiger tigerWithName:@"王五" weight:130];
        
        Tiger *t2 = [Tiger tigerWithName:@"李四" weight:140];
        
        Tiger *t3 = [Tiger tigerWithName:@"赵六" weight:150];
        
        NSArray *array = @[t0,t1,t2,t3];
        
//        NSArray *names =[array valueForKeyPath:@"self.weight"];
        
//        NSLog(@"%@",names);
        
        
//        获取集合中所有对象的某个数值属性的常用统计值，结果为NSNumber;
        
        NSNumber *num = [array valueForKeyPath:@"@max.weight"];
        
        NSLog(@"%@",num);
        
        
//        －－－－－－－－－－－－－－－－－－－－－－－－－－－－
//        并不是所有的key都能找到对应的方法或实例变量，如果没有找到的话，就认为这个key是一个undefinedKey。访问未定义的key会导致程序崩溃（crash），可以通过重写下面的方法进行处理；

#if 0
        - (void)setValue:(id)value forUndefinedKey:(NSString *)key
        {
            NSLog(@"k-v:%@-%@",value,key);
        }
        
        - (id)valueForUndefinedKey:(NSString *)key
        {
            return @"Test";
        }

        
//对于数值类型的属性（实例变量），如果使用kvc设置的值为nil，会导致程序崩溃，可以通过重写下面的方法处理；
        －（void）setNilValueForKey:(NSString *)key
        {
            NSLog(@"key: %@",key);
        }


#endif
#endif
        
        
//        －－－－－－－－－－－－－－－－－－－－－－－－－－－－
        
//      键值观察；
        
//        在代码中，如果一个对象需要根据另外一个对象的某个属性点变化而发生改变，可以通过kvo进行观察；
        
        
        
    }
    return 0;
}
